<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /**
     *  https://leetcode-cn.com/problems/3sum/
     *  思路：
     *  ● 先将数组进行排序
     * 
     *  ● 从左侧开始，选定一值为 定值 ，右侧进行求解，获取与其相加为 0 的两个值
     *  ● 类似于快排，定义首和尾
     *  ● 首尾与 定值 相加
     *
     *    1.等于 0，记录这三个值
     *    2.小于 0，首部右移
     *    3.大于 0，尾部左移
     *
     *  ● 定值右移，重复该步骤
     */ 
    const nums = [-1,0,1,2,-1,-4];

    function threeSum(nums) {
      let ans = [];
      let len = nums.length;
      if (len < 3) return ans;
      nums.sort((a, b) => a - b) // 排序
      
      for (let i = 0; i < len; i++) {
        if (nums[i] > 0) break; // 如果当前数字大于0，则三数之和一定大于0，所以结束循环
        if (i > 0 && nums[i] === nums[i-1]) continue; // 去重
        let L = i + 1;
        let R = len - 1;
        while (L < R) {
          let sum = nums[i] + nums[L] + nums[R];
          if (sum === 0) {
            ans.push([nums[i], nums[L], nums[R]])
            while (L < R && nums[L] === nums[L+1]) L++; // 去重
            while (L < R && nums[R] === nums[R-1]) R--; // 去重
            L++;
            R--;
          }
          else if (sum < 0) L++;
          else if (sum > 0) R--;
        }
      }
      return ans;
    }
    console.log(threeSum(nums));
  </script>
</body>
</html>